#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <pthread.h>
#include <errno.h>



void* tfun12(void* args){
		char buf[100]={0};
		int sockfd=(int )args;
		printf("son thread...tfun1.... pid = %d ...  %lu-sockfd--%d \n",getpid(),pthread_self(),sockfd);
		while(1){
		  memset(buf,0,sizeof(buf));
	      int len  = read(sockfd,buf,sizeof(buf));
	      if(len == -1){ 
	     	perror("read error ");
		   exit(1);
	     }else if(len == 0){
		    printf("服务端关闭了连接\n");
		   break;
    	}else{
          //继续读
	      printf("读到了: %s",buf);
     	}
	  }
	  //  sleep(1);
	    return NULL;
}



// gcc clint.c -o   client.o  
// gcc server.c -o  server.o
#define SERADDR		"192.168.105.10"		// 服务器开放给我们的IP地址和端口号
#define SERPORT		9003

char sendbuf[100]={0};

int main(int argc, const char* argv[])
{

		// 第1步：先socket打开文件描述符
	int sockfd = -1, ret = -1;
	struct sockaddr_in seraddr = {0};
	struct sockaddr_in cliaddr = {0};
	pthread_t tid;
	

 if(argc < 2 ) {
  perror("  ./a.out port no  \n");
  exit(1);
 }

   int port = atoi(argv[1]);



	
	// 第1步：socket  打开客户端文件描述符
	sockfd = socket(AF_INET, SOCK_STREAM, 0);  
	if (-1 == sockfd)
	{
		perror("socket  fail");
		return -1;
	}

    int on = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //设置网络属性重用地址

	printf("socketfd = %d.\n", sockfd);
	
	// 第2步：connect链接服务器
	seraddr.sin_family = AF_INET;		// 设置地址族为IPv4
	seraddr.sin_port = htons(port);	// 设置地址的端口号信息
	seraddr.sin_addr.s_addr = inet_addr(SERADDR);	//　设置IP地址， 字符串转化为10进制  unsign int 

// 2种方法， IP 转化为网络字节序
//	ret = inet_pton(AF_INET, SERADDR, &seraddr.sin_addr.s_addr);

	ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
	if (ret < 0)
	{
		perror("connect fail");
		return -1;
	}
	printf("connect result, ret = %d.\n", ret);


 	// int ret= pthread_create(&tid, NULL, tfun12, (void*) 1999);  // 返回线程id
	 ret= pthread_create(&tid, NULL, tfun12, (void*) sockfd);  // 返回线程id
	 if (ret !=0 ) {
		 fprintf(stderr,"pthread_create fail--%s \n",strerror(ret));
			exit(1);
		}
		ret= pthread_detach(tid); //设置线pthread_join程分离,0表示成功
     
		// 分离开以后，线程执行完毕会被自动回收tid,没有了，后面pthread_join 来回收会出错
		if(ret!=0){
			 fprintf(stderr,"pthread_detach fail--%s \n",strerror(ret));
						exit(1);
		}


	char buf[100]={0};

while(1){

	//等待接受
	memset(buf,0,sizeof(buf));
	printf("请输入要发送的字符串:\n");
	//fgets输入enter 结束buf末尾带有\n
	fgets(buf,sizeof(buf),stdin);
	write(sockfd,buf,strlen(buf));
}

	close(sockfd);

	// ret = recv(sockfd, sendbuf, sizeof(sendbuf), 0);
	// printf("成功接收了%d个字节\n", ret);
	// printf("client发送过来的内容是：%s\n", sendbuf);
	

	return 0;
}